// var person = {
//   name: "张三"
// };

// var proxy = new Proxy(person, {
//   get: function(target, propKey) {
//     if (propKey in target) {
//       return target[propKey];
//     } else {
//       throw new ReferenceError("Prop name \"" + propKey + "\" does not exist.");
//     }
//   }
// });

// proxy.name // "张三"
// proxy.age // 抛出一个错误

// let proto=new Proxy({},{
//   get(target,propertyKey,receiver){
//     console.log('GET ' + propertyKey);
//     return target[propertyKey]
//   }
// })

// let obj=Object.create(proto)

// proto.foo

// // 数组取负数坐标
// function createArray(...elements){
//   let hander={
//     get(target,propKey,receiver){
//       let index=Number(propKey);
//       if(index<0){
//         propKey=String(target.length+index);
//       }
//       return Reflect.get(target,propKey,receiver);


//     }
//   }
//   let target=[]
//   target.push(...elements);
//   return new Proxy(target,hander)


// }

// let arr=createArray('a','b','c');

// console.log(arr[-1])


// var pipe = function (value) {
//   var funcStack = [];
//   var oproxy = new Proxy({} , {
//     get : function (pipeObject, fnName) {
//       if (fnName === 'get') {
//         return funcStack.reduce(function (val, fn) {
//           return fn(val);
//         },value);
//       }
//       funcStack.push(global[fnName]);
//       return oproxy;
//     }
//   });

//   return oproxy;
// }

// var double = n => n * 2;
// var pow    = n => n * n;
// var reverseInt = n => n.toString().split("").reverse().join("") | 0;

// pipe(3).double.pow.reverseInt.get; // 63


const hadeler={
  get (target,key){
    invariant(key,'get');
    return target[key];
  },
  set(target,key,value){
    invariant(key,'set');
    target[key]=value;
    return true;
  }
};
function invariant(key,action){
  if(key[0]==='_'){
    throw new Error(`Invalid111 attempt to ${action} private "${key}" property`)
  }
}

const target = {};
const proxy = new Proxy(target, hadeler);
proxy.prop="1231231"
// Error: Invalid attempt to get private "_prop" property
// proxy._prop = 'c'